<?php 
namespace yphp;

/**
* cookie 类
*/
class Cookie extends Instance
{
	// 设置参数
	protected static $config = [
		'prefix'    => '', // cookie 名称前缀
        'expire'    => 0, // cookie 保存时间
        'path'      => '/', // cookie 保存路径
        'domain'    => '', // cookie 有效域名
        'secure'    => false, //  cookie 启用安全传输
        'httponly'  => false, // httponly 设置
        'setcookie' => true, // 是否使用 setcookie
	];

	// 是否完成初始化
	protected static $init;

	// 初始化配置
	static function init(array $config = [])
	{
		if (empty($config)) {
			$config = Config::web('cookie');
		}

		self::$config = array_merge(self::$config,array_change_key_case($config));

		if(!empty(self::$config['httponly'])){
			ini_set('session.cookie_httponly', 1);
		}

		self::$init = true;
	}

	// 设置或者获取cookie作用域（前缀）
	public static function prefix($prefix = '')
	{
		if (empty($prefix)) {
			return self::$config['prefix'];
		}

		return self::$config['prefix'] = $prefix;
	}

	//+------------------------------------------------------
	// cookie 设置、获取、删除
	//+------------------------------------------------------

	public static function set($name,$value='',$option = null)
	{
		!isset(self::$init) && self::init();

		// 设置参数
		if (!is_null($option)) {
			if (is_numeric($option)) {
				$option = ['expire'=>$option];
			} elseif (is_string($option)) {
				parse_str($option,$option);
			}

			$config = array_merge(self::$config,array_change_key_case($option));
		} else {
			$config = self::$config;
		}

		$name = $config['prefix'] . $name;

		// 设置cookie
		if (is_array($value)) {
			array_walk_recursive($value, 'self::jsonFormatProtect','encode');
			$value = 'think:' . json_encode($value);
		}

		$expire = !empty($config['expire']) ? $_SERVER['REQUEST_TIME'] + intval($config['expire']) : 0;

		if ($config['setcookie']) {
			setcookie($name,$value,$expire,$config['path'],$config['domain'],$config['secure'],$config['httponly']);
		}

		$_COOKIE[$name] = $value;
	}

	// 永久保存
	public static function forever($name,$value='',$option = null)
	{
		if (is_null($option) || is_numeric($option)) {
			$option = [];
		}

		$option['expire'] = 315360000;

		self::set($name,$value,$option);
	}

	// 判断是否有cookie数据
	public static function has($name,$prefix = null)
	{
		!isset(self::$init) && self::init();

		$prefix = !is_null($prefix) ? $prefix : self::$config['prefix'];

		return isset($_COOKIE[$prefix . $name]);
	}

	// 获取cookie的值
	public static function get($name = '',$prefix = null)
	{
		!isset(self::$init) && self::init();

		$prefix = !is_null($prefix) ? $prefix : self::$config['prefix'];
		$key    = $prefix . $name;

		if ('' === $name) {
		 	if ($prefix) {
		 		$value = [];
		 		foreach ($_COOKIE as $k => $v) {
		 			if (0 === strpos($k, $prefix)) {
		 				$value[$k] = $val;
		 			}
		 		}
		 	} else {
		 		$value = $_COOKIE;
		 	}
		 } elseif (isset($_COOKIE[$key])) {
		 	$value = $_COOKIE[$key];
		 	if (0 === strpos($value, 'think:')) {
		 		$value = json_decode(substr($value, 6),true);
		 		array_walk_recursive($value, 'self::jsonFormatProtect','decode');
		 	}
		 } else {
		 	$value = null;
		 }

		 return $value;
	} 

	// 删除cookie
	public static function delete($name,$prefix = null)
	{
		if ($name === '') {
			throw new Exception("请输入要删除的键");
		}

		!isset(self::$init) && self::init();

		$config = self::$config;

		$prefix = is_null($prefix) ? $config['prefix'] : $prefix;

		$key = $prefix . $name;

		if ($config['setcookie']) {
			setcookie($name,'',$_SERVER['REQUEST_TIME'] - 3600,$config['path'],$config['domain'],$config['secure'],$config['httponly']);
		}

		unset($_COOKIE[$name]);
	}

	// 清除指定前缀所有cookie
	public static function clear($prefix = null,$force = false)
	{
		if (empty($_COOKIE)) return;

		!isset(self::$init) && self::init();

		$config = self::$config;

		$prefix = is_null($prefix) ? $config['prefix'] : $prefix;

		if ($prefix) {
			foreach ($_COOKIE as $k => $v) {
				if (0 === strpos($k, $prefix)) {
					if ($config['setcookie']) {
						setcookie($k,'',$_SERVER['REQUEST_TIME'] - 3600,$config['path'],$config['domain'],$config['secure'],$config['httponly']);
					}

					unset($_COOKIE[$k]);
				}
			}
		}  elseif ($force) {
			# 强制删除所有cookie
			foreach ($_COOKIE as $k => $v) {
				if ($config['setcookie']) {
					setcookie($k,'',$_SERVER['REQUEST_TIME'] - 3600,$config['path'],$config['domain'],$config['secure'],$config['httponly']);
				}
				unset($_COOKIE[$k]);
			}
		}
	}

	// json 转换时的格式保护
	protected static function jsonFormatProtect(&$val,$key,$type = 'encode')
	{
		if (!empty($val) && true !== $val) {
			$val = 'decode' == $type ? urldecode($val) : urlencode($val);
		}
	}


}